//
//  main.cpp
//  9.28_test
//
//  Created by Shi HaoRan on 2023/9/28.
//

#include <iostream>
#include <string>

using namespace std;

template<class T1, class T2>
struct myPair
{
    T1 _first;
    T2 _second;
    
    myPair(T1 data1, T2 data2)
        :_first(data1),
        _second(data2)
    { }
};

template<class T>
struct testListNode
{
    testListNode(const T& data = T())
        :_data(data),
        _next(nullptr)
    { }
    
    template<class...Args>
    testListNode(Args&&...args)
        :_data(args...),
        _next(nullptr)
    { }
    
    T _data;
    testListNode<T>* _next;
};

template<class T>
class testList
{
public:
    testList()
        :_head(nullptr), _tail(nullptr)
    { }
    
    template<class...Args>
    void emplace_back(Args&&...args)
    {
        testListNode<T>* newNode = new testListNode<T>(args...);
        if(_head == nullptr) {
            _head = _tail = newNode;
        }
        else
        {
            _tail->_next = newNode;
            _tail = newNode;
        }
    }
    
    void print()
    {
        testListNode<T>* cur = _head;
        while(cur) {
            cout << cur->_data._first << ' ';
            cur = cur->_next;
        }
        cout << endl;
    }
    
private:
    testListNode<T>* _head;
    testListNode<T>* _tail;
    size_t _size;
};

void test1()
{
    testList<myPair<int, string>> l;
    string str("hello");
    l.emplace_back(1, str);
    l.emplace_back(2, str);
    l.emplace_back(3, str);
    l.emplace_back(5, str);
    l.emplace_back(9, str);
    l.print();
}

void test2()
{
    testList<int> l;
    l.emplace_back(10);
    l.emplace_back();
}

int main()
{
    test1();
    //test2();
    return 0;
}
